package moduloIndexacion.gestores;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.*;

import mapeo.MapDocumento;
import mapeo.MapExtension;
import entidades.Documento;
import entidades.Extension;

public class GestorDocumento {
	
	private MapDocumento mapDoc; 

	public GestorDocumento(){
		mapDoc = new MapDocumento();
	}
	
	/**
	 * Metodo que recibe un File, lo castea a Documento y procede a Guardarlo en la Base de Datos
	 * @param f: Documento a guardar
	 * @return el documento guardado, o null en caso de haber sucedido un fallo.
	 */
	public Documento saveDocumento(File f){
		File file = f;
		if( !file.exists() ){
			return null;
		}
		
		String nombre = file.getName();
		String directorio = f.getParent()+"\\";; //Para que funcione en todos lods directorios
	        
	    Pattern patron = Pattern.compile("\\.+");
		String []tokens = patron.split(nombre);
		String extension = tokens[tokens.length-1];
			
			
		if(directorio.isEmpty() || nombre.isEmpty() || extension.isEmpty()){
			return null;
		}
		
		MapExtension mapExt = new MapExtension();
		Extension ext = (Extension) mapExt.get(extension);
	    if(ext == null){
	    	return null;
	    }
		
	    Documento doc = new Documento(directorio, nombre, ext);
	    int resultado = (Integer) mapDoc.save(doc);
		if(resultado == mapDoc.CODIGO_ERROR){
			return null;
		}
		
	    return (Documento) mapDoc.get(resultado);
	}
	
	/**
	 * Metodo que chequea que los documentos almacenados en la BD existan.
	 * @return una lista de documentos que ya no existen y estan almacenados en la BD
	 */
	public ArrayList<Documento> consistirBaseDatosDocumentos(){
		ArrayList<Documento> docEliminados = new ArrayList<Documento>();
		ArrayList<Documento> docSistema =mapDoc.obtenerDocumentosSistema();
		Iterator<Documento> iterador = docSistema.iterator();
		while(iterador.hasNext()){
			Documento aux = iterador.next();
			String direccion = aux.getUbicacion() + aux.getNombre();
			File f = new File(direccion);
			if( ! f.exists() ){
				docEliminados.add(aux);
			}
		}
		return docEliminados;
	}

	/**
	 * Metodo que elimina un Documento de la BD
	 * @param documento a eliminar
	 * @return true en caso de poder eliminarlo, false en caso contrario.
	 */
	public boolean eliminarDoc(Documento next) {
		if(mapDoc.delete(next.getId())){
			return true;
		}
		return false;
	}
	
	/*
	 * Metodo que elimina todos los documentos de la Bd
	 * @return true en caso que se pueda realizar la transaccion, false en caso contrario
	 */
	public boolean deleteAll(){
		return mapDoc.deleteAll();
	}
}
